﻿// 08_指针的定义与使用.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//

#include <iostream>
using namespace std;

int main()
{
    cout << "================================1.定义指针==============================" << endl;

    //1.定义指针
    int a = 10; //定义指针
    int *p ;//指定指针的语法
    p = &a;//指针记录变量a的地址
    cout << "a的地址为:" << &a << endl;
    cout << "指针p为:" << p << endl;

    //2.使用指针->通过解引用的方式来找到指针指向的内存
    //指针前加 * 代表解引用，找到指针指向的内存中的数据
    *p = 1000;
    cout << "a=" << a << endl;
    cout << "*p=" << *p << endl;

    
    cout << "================================2.指针所占用的空间==============================" << endl;
    /*----------------------------------------------------指针所占用的空间------------------------------------------------------*/

    int c = 10;

    int* D = &c;

    cout << "sizeof(int *): " << sizeof(D) << endl;
    //各种指针所占用的内存空间->32位4字节 64位8字节
    cout << "sizeof(int *): " << sizeof(int *) << endl;
    cout << "sizeof(double *): " << sizeof(double*) << endl;

    cout << "================================3.指针所占用的空间==============================" << endl;
    /*----------------------------------------------------空指针------------------------------------------------------*/
    //指针变量p指向内存地址编号为0的空间
    int* p_null = NULL;

    //访问空指针报错
    //*p = 100;

    //内存编号0~255为系统占用内存,不允许用户访问
    cout << *p_null << endl;


    cout << "================================4.野指针==============================" << endl;
    /*----------------------------------------------------野指针------------------------------------------------------*/
    //错误指向的指针

    cout << "================================5.常量指针/指针常量==============================" << endl;
    /*----------------------------------------------------常量指针/指针常量------------------------------------------------------*/
    //常量指针: 女朋友有很多个，但是性格固定，你不喜欢某个可以换下一个
    //指针常量: 只能有一个女朋友，但是这个女朋友可以有多重性格
    //const修饰指针和常量:女朋友人不可以换，性格也不能改 

    //1.const修饰指针
    int a1 = 10;
    int b1 = 10;

    //指针指向的值不能改，指针的指向可以改
    const int* p1 = &a;
    //*p=20 错误
    p1 = &b1;


    //2.const修饰常量
    int* const p2 = &a1;
    *p2 = 100;//正确

    //p2 = &b;//错误，指针的指向不可以修改

    //3.const修饰指针和常量
    const int* const p3 = &a;
    //指针指向与值都不能改

    cout << "================================5.指针和数组==============================" << endl;
    //利用指针访问数组中的元素
    int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };

    cout << "第一个元素:" << arr[0] << endl;

    int* p_arr = arr;//arr就是数组首地址

    cout << "利用指针访问第一个元素: " << *p_arr << endl;

    //让指针后移四个字节 1是四字节，刚刚好
    p_arr++;

    cout << "利用指针访问第二个元素: " << *p_arr << endl;

    int* p_arr2 = arr;

    for (int i = 0; i < 10; i++)
    {
        cout << *p_arr2 << endl;
        *p_arr2++;
    }
}

// 运行程序: Ctrl + F5 或调试 >“开始执行(不调试)”菜单
// 调试程序: F5 或调试 >“开始调试”菜单

// 入门使用技巧: 
//   1. 使用解决方案资源管理器窗口添加/管理文件
//   2. 使用团队资源管理器窗口连接到源代码管理
//   3. 使用输出窗口查看生成输出和其他消息
//   4. 使用错误列表窗口查看错误
//   5. 转到“项目”>“添加新项”以创建新的代码文件，或转到“项目”>“添加现有项”以将现有代码文件添加到项目
//   6. 将来，若要再次打开此项目，请转到“文件”>“打开”>“项目”并选择 .sln 文件
